# locust777

////位操作符
//
///*
//&   //按 （2进制） 位与......全真为真，有假为假
//|   //按 （2进制） 位或......有真则真，全假为假
//^   //按 （2进制） 位异或......相同为为0，不同为1
//*/
//
////注 ： 他们的操作数必须是整数
//
//
//int main()
//{
//	int a = 3;
//	int b = -5;
//	int c = a & b;
//
//	//int c = a | b;//后期重新理解
//
//	//int c = a ^ b;
//
//	//000000000000000000000000000011 3的原码
//	//000000000000000000000000000011 3的反码
//	//000000000000000000000000000011 3的补码
//
//	//100000000000000000000000000101 -5的原码
//	//111111111111111111111111111010 -5的反码
//	//111111111111111111111111111011 -5的补码
//
//	//000000000000000000000000000011 3的补码
//	//111111111111111111111111111011 -5的补码
//	//000000000000000000000000000011 按位与&
//
//
//
//	//
//	//%d 意味着打印一个有符号的整数
//	//
//
//	printf("c=%d\n",c);
//return 0;
//}


//
////不能创建临时变量（第三个变量），实现两个数的交换
//
//#include<stdio.h>
//int main()
//{
//	int a = 3;
//	int b = 5;
//	//int c = 0;//空瓶
//	printf("交换前：a=%d b=%d\n",a,b);
//	//c = a;
//	//a = b;
//	//b = c;
//
//	//进阶方法2//这种方法会有溢出
//	//a = a + b;
//	//b = a - b;
//	//a = a - b;
//
//	//进阶方法3
//	a = a ^ b;//3^5
//	b = a ^ b;//3^5^5 --> b=3
//	a = a ^ b;//3^5^3 --> a=5
//	printf("交换后：a=%d b=%d\n",a,b);
//	scanf("%d",a);
//return 0;
//}
//
////3^3 = 0 -> a^a=0
////011
////011
////000
//
////0^5 = 5 ->0^a=a
////000
////101
////101
//
//
//
//
//
////3^3^5 = 5
////3^5^3 = 5  //支持交换律
////011
////101
////110
////011
////101




//编写代码实现：求一个整数存储在内存中的二进制中1的个数
//求补码中二进制的个数
//
////int a = 3;
////000000000000000000000000000011
//
////a&1
////000000000000000000000000000011
////000000000000000000000000000001
////000000000000000000000000000001
////>>  <<
////
//
//////方法1
////#include<stdio.h>
////int main()
////{
////	int num  = 10;
////	int count = 0;//计算
////	while(num)
////	{
////	if(num%2 == 1)
////		count++;
////	num = num/2;
////	}
////	printf("二进制中1的个数  = %d\n",count);
////	scanf("%d",count);
////return 0;
////}
////
////这种有缺陷，有问题
//
//
////方法2
//#include<stdio.h>
//int main()
//{
//	int num = -1;
//	int i = 0;
//	int count = 0;
//	for(i=0;i<32;i++)
//	{
//	if(num&(1 << i))
//		count++;
//	}
//	printf("二进制中1的个数 = %d\n",count);
//	scanf("%d",count);
//return 0;
//}




//赋值操作符
//int weight = 120; //体重
//weight = 89; //不满意就赋值
//
//
////赋值的连续使用
////int a = 10;
//int x = 0;
//int y = 20;
//
//a = x = y+1;//连续赋值
//这样的代码怎么样？


//
//int main()
//{
//int a = 3;
//a = a + 5;
//a += 5;
//
//a = a >> 1;
//a >>= 1;
//
//return 0;
//}

//
//
////单目操作符介绍
//！   逻辑反操作符                                       单目操作符
//-    负值                                               只有一个操作数
//+    正值                              
//&    取地址                                             +
//sizeof  操作数的类型长度（以字节为单位）                a + b 双目操作符 +操作符有2个操作数 
//~    对一个数的二进制按位取反
//--   前置，后置-
//++   前置，后置++
//*    间接访问操作符（解引用操作符）
//（类型）  强制类型转换


//
//c语言中0表示假，非0表示真
//
//
//
//#include<stdio.h>
//int main()
//{
//	//int a = 10;
//	//int b = -a;//单目操作符
//	//printf("%d\n",a);
//	//printf("%d\n",b);
//	//scanf("%d",a);
//
//    int a = 10;
//	printf("%p\n",&a);
//	int* p = &a;//p就是指针变量
//	scanf("%d",a);
//return 0;
//}


//#include<stdio.h>
//int mian()
//{
//
//	int arr[5] = {0};
//	//int a = 10;
//	////int n = sizeof(a);//计算的是a所占内存的大小，单位是字节
//	//int n = sizeof(int);
//	//printf("n=%d",n);//2010版本不能用变量代替
//
//
//	//sizeof是一个操作符
//	//计算的是变量所占内存空间的大小
//	//计算类型所创建的变量占据空间的大小
//
//	printf("n=%d",sizeof(arr));//跳转不了
//	return 0;
//}


#include<stdio.h>
int main()
{
	int a = 0;

	// ~ 是按二进制位取反
	//000000000000000000000000000000  -补码
	//111111111111111111111111111111  -> ~a
	//111111111111111111111111111110  - ~a的反码
	//100000000000000000000000000001  - ~a的原码
	//-1

	int b = 3;
	//000000000000000000000000000011 补码
	//111111111111111111111111111100  ~b补码
	//111111111111111111111111111011  ~b反码
	//100000000000000000000000000100  ~b原码
	//-6
	printf("%d\n",~b);//-6
	printf("%d\n",~a);//-1
	scanf("%d",a);
	return 0;
}
